<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>d</title>
</head>
<body>
<script src="d.js"></script>
<script>
  new _Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(1)
    })
    /*
    * 其实then里面返回的可以不是一个Promise对象。thenable可以理解为是一种轻量级的Promise对象
    * 只要对象里面有then方法，并且then方法中的参数是函数 新的Promise对象就会接收then方法中的传参
    * Promise所做的是把我们的返回值包装成一个Promise对象，所谓的包装对象就是就是新对象的属性值来自于接收的数据
    *
    * 值得注意的是虽然Promise是同步的调用thenable对象中的then方法的，但是如果我们的then对象中是异步代码那么
    * 也会等待我们的异步代码执行完再执行同步代码
    *
    *
    * */
  }).then(value => new Thenable())
    .then(value =>{
        console.log(value);
  })

  class Thenable{
    then(resolve,reject){
      setTimeout(()=>{
        resolve(100)
      },2000)
    }
  }

  console.log("-----------");
  
  
  function foo1(fn){
    setTimeout(()=>{
      fn(100)
    },2000)
  }
  
  function foo() {
    foo1(num =>{
      console.log(num);
      /*
      * 如果逻辑写在这里的话那么要等待异步执行完之后再执行这里
      * */
    })

    /*
    * 如果写在这里的话就不会等待异步执行完了
    * */
    console.log("foo");
  }

  foo()
</script>
</body>
</html>